

#include "HeaderFiles.h"


// function define
void spi0_gpio_init(void);
void spi1_gpio_init(void);
void spi0_config(void);
uint16_t spi0_send(uint16_t data);
uint16_t spi1_send(uint16_t data);


/*!
    \brief      
    \param[in]  none
    \param[out] none
    \retval     none
*/

void spi0_init(void)
{
	#if 0
	rcu_periph_clock_enable(RCU_SPI0);
	spi0_gpio_init();
	SET_SPI0_NSS_HIGH;
	spi_enable(SPI0);
	#endif
	
	rcu_periph_clock_enable(RCU_SPI1);
	spi1_gpio_init();
	spi0_config();
	SET_SPI1_NSS_HIGH;
	spi_enable(SPI1);

}


/*!
    \brief      
    \param[in]  none
    \param[out] none
    \retval     none
*/

void spi0_gpio_init(void)
{
	
	#ifdef GD32F303_64PIN

    /* SPI0 GPIO config:SCK/PA5, MISO/PA6, MOSI/PA7 */
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7);
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
    /* PA4 as SPI0 NSS */
    gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);	
	
	#else
	
	gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);
    /* PA15 as SPI0 NSS */
    gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);	
	
	gpio_pin_remap_config(GPIO_SPI0_REMAP, ENABLE);

    /* SPI0 GPIO config:SCK/PB3, MISO/PB4, MOSI/PB5 */
    gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3 | GPIO_PIN_5);
    gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
	
	#endif
}


/*!
    \brief      
    \param[in]  none
    \param[out] none
    \retval     none
*/

void spi1_gpio_init(void)
{

    /* SPI1 GPIO config:SCK/PB13, MISO/PB14, MOSI/PB15 */
    gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_15);
    gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
    /* PB12 as SPI1 NSS */
    gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);	
}



/*!
    \brief      
    \param[in]  none
    \param[out] none
    \retval     none
*/

void spi0_config(void)
{

    spi_parameter_struct spi_init_struct;

	#if 0
    /* SPI0 parameter config */
    spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;
    spi_init_struct.device_mode          = SPI_MASTER;
    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE;
    spi_init_struct.nss                  = SPI_NSS_SOFT;
    spi_init_struct.prescale             = SPI_PSC_64;
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
	
    spi_init(SPI0, &spi_init_struct);
	#endif
	
	spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;
    spi_init_struct.device_mode          = SPI_MASTER;
    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;//SPI_CK_PL_LOW_PH_2EDGE;
    spi_init_struct.nss                  = SPI_NSS_SOFT;
    spi_init_struct.prescale             = SPI_PSC_64;
    spi_init_struct.endian               = SPI_ENDIAN_MSB;

    spi_init(SPI1, &spi_init_struct);
}


/*!
    \brief      
    \param[in]  none
    \param[out] none
    \retval     none
*/

uint16_t spi0_send(uint16_t data)
{
	uint16_t rec_data;
	uint16_t timeout_cnt = 0;

	while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE));
	spi_i2s_data_transmit(SPI0, data);

	while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE))
	{
		if(++timeout_cnt > 100)
		{
			return  0xFF;
		}
	}
    rec_data = spi_i2s_data_receive(SPI0);

	return rec_data;

}




/*!
    \brief      
    \param[in]  none
    \param[out] none
    \retval     none
*/
uint16_t spi1_send(uint16_t data)
{
	uint16_t rec_data;
	uint16_t timeout_cnt = 0;

	while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));
	spi_i2s_data_transmit(SPI1, data);

	while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE))
	{
		if(++timeout_cnt > 100)
		{
			return  0xFF;
		}
	}
    rec_data = spi_i2s_data_receive(SPI1);

	return rec_data;
}











